//package com.dddd.blogsp.config;
//
//import Task;
//import BlogAuthorTask;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
//import org.springframework.scheduling.support.CronTrigger;
//import org.springframework.stereotype.Component;
//
//import javax.annotation.Resource;
//import java.util.*;
//import java.util.concurrent.ScheduledFuture;
//
//@Component
//public class DynamicTaskConfig {
//
//    private static Logger logger = LoggerFactory.getLogger(DynamicTaskConfig.class);
//
//    /**
//     * 每一分钟执行一次
//     */
//    private static final String DEFAULT_CRON = "* */1 * * * *";
//
//    private static int MAX_SPIDER_COUNT = 5;
//
//    @Resource(name = "syncScheduler")
//    private ThreadPoolTaskScheduler syncScheduler;
//
//    private Map<String,Task> taskMap = new HashMap<>(MAX_SPIDER_COUNT);
//
//    private List<String> taskList = new ArrayList<>();
//
//    @Resource
//    private BlogAuthorTask blogAuthorTask;
//    /**
//     * @param name
//     * @param cron
//     * @return 是否开启成功
//     * 开启一个定时任务
//     */
//    private boolean startTask(String name,String cron){
//
//        if(taskMap.size() > MAX_SPIDER_COUNT){
//            logger.warn("To Many Spider're Running");
//            return false;
//        }
//        if(taskMap.get(name) != null){
//            ScheduledFuture future = buildFuture(blogAuthorTask, cron);
//            taskMap.get(name).setFuture(future);
//            return true;
//        }
//        else{
//            Task task = new Task();
//            task.setId(UUID.randomUUID().toString().substring(0,10));
//            task.setName(name);
//            task.setCron(cron);
//            task.setCreateTime(new Date());
//            task.setUpdateTime(new Date());
//            ScheduledFuture newSchedule = buildFuture(blogAuthorTask, cron);
//            task.setFuture(newSchedule);
//            taskMap.put(name,task);
//            taskList.add(name);
//            return true;
//        }
//    }
//
//
//    /**
//     * @param name
//     * @return
//     * 默认配置开启一个任务
//     */
//    private boolean startTask(String name){
//        this.startTask(name,DEFAULT_CRON);
//        return true;
//    }
//
//
//    /**
//     * @param name
//     * @param cron
//     * @return
//     */
//    private boolean stopTask(String name,String cron){
//
//        ScheduledFuture<?> future = taskMap.get(name).getFuture();
//        if(future == null){
//            return true;
//        }
//
//        if(future.isDone()){
//            while(future.isDone()){
//                try {
//                    Thread.sleep(80);
//                    logger.info("任务未开始...");
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                    return false;
//                }
//            }
//            future.cancel(false);
//            logger.info("定时任务["+name+"]取消成功");
//            taskList.remove(name);
//            return true;
//        }
//
//        boolean cancel = future.cancel(false);
//        if(cancel){
//            logger.info("定时任务["+name+"]取消成功");
//            taskList.remove(name);
//            return true;
//        }else{
//            logger.info("定时任务["+name+"]取消失败");
//            return false;
//        }
//    }
//
//
//    /**
//     * @param name
//     * @param cron
//     * @return
//     * 修改定时任务
//     */
//    private boolean updateTask(String name,String cron){
//        Task task = taskMap.get(name);
//        ScheduledFuture<?> target = task.getFuture();
//
//        if (!target.isDone()){
//            target.cancel(true);
//        }
//
//        ScheduledFuture<?> future;
//
//        future = buildFuture(blogAuthorTask,cron);
//
//        task.setCron(cron);
//        task.setUpdateTime(new Date());
//        task.setFuture(future);
//        taskMap.replace(name, task);
//        logger.info("定时任务修改成功...");
//        return true;
//    }
//
//
//    /**
//     * @param cron
//     * @return
//     */
//    private ScheduledFuture buildFuture(Runnable task, String cron){
//
//        return syncScheduler.schedule(task, new CronTrigger(cron));
//
////        return syncScheduler.schedule(blogAuthorTask, triggerContext -> {
////            new CronTrigger(cron).nextExecutionTime(triggerContext);
////        });
//
//    }
//
//}
